import {IconifyInfo, IconifyJSON} from "@iconify/types"
import {FetchUtil} from '@xtail/req'
import {genSetIconsAll} from './gen-set-icons-all.ts'

/**
 * 获取 Iconify 指定图标集中图标列表时返回的结果对象类型
 */
export interface IconifySetIcons {
  // 图标集前缀
  prefix: string;
  // 图标数量（与 info?.total 重复）
  total: number;
  // 图标集标题，如果存在（与 info?.name 重复）
  title?: string;
  // 图标集信息
  info?: IconifyInfo;
  // 未分类的图标列表
  uncategorized?: string[];
  // 按分类排序的图标列表（分类名称 => 图标列表）
  categories?: Record<string, string[]>;
  // 隐藏的图标列表
  hidden?: string[];
  // 别名列表（键为别名，值为对应的父图标）
  aliases?: Record<string, string>;
  // 字符映射（键为字符，值为图标名称）
  chars?: Record<string, string>;
  // 主题配置
  themes?: IconifyJSON['themes'];
  // 前缀配置
  prefixes?: IconifyJSON['prefixes'];
  // 后缀配置
  suffixes?: IconifyJSON['suffixes'];
  // 所有图标名称列表
  all?: string[];
}

export type GetIconifySetIconsOptions = {
  info?: boolean;
  all?: boolean;
}

/**
 * 获取 Iconify 指定图标集中的图标列表
 * Iconify 文档：https://iconify.design/docs/api/collection.html
 *
 * @param {string} prefix 图标集前缀，用于指定要获取的图标集
 * @param {GetIconifySetIconsOptions} options 获取 Iconify 指定图标集中的图标列表的配置选项：
 * - info 在获取到的响应数据中是否包含图标集的信息，默认为 false
 * - all 在返回的对象中是否包含存储所有图标名称的列表（未分类的图标名称列表和按分类排序的图标名称列表），默认为 true
 * @returns {Promise<IconifySetIcons>} Iconify 指定图标集图标列表信息对象
 */
export const getSetIcons = async (
  prefix: string,
  options: GetIconifySetIconsOptions = {}
): Promise<IconifySetIcons> => {
  const {info, all} = {
    info: false,
    all: true,
    ...options
  }
  let url = `https://api.iconify.design/collection?prefix=${prefix}&info=${info}&pretty=1`
  return await FetchUtil.req({url})
    .then((iconifySetIcons: IconifySetIcons) => {
      // 在返回的对象中需要包含存储所有图标名称的列表
      if (all) {
        // 未分类的图标名称列表和根据按分类排序的图标名称列表生成的未分类图标名称列表组合成所有图标名称的列表
        iconifySetIcons.all = genSetIconsAll(iconifySetIcons.categories, iconifySetIcons.uncategorized)
      }
      // 返回 Iconify 图标集图标列表信息对象
      return iconifySetIcons
    })
    .catch((error) => Promise.reject(error))
}

export type GetIconifySetIconsType = typeof getSetIcons
